<?php
class Slog_Controller_Dispatcher
{
	protected $mode;
	protected $_current_controller;
	protected $_current_action;
	protected $_tokens;

	public function init()
	{
		// Lista de tokens
		$this->_tokens = array();
		
		// Obtenemos el modo de ejecución
		$this->mode = Slog::router()->mode;
		
		// Añadimos el token que se configuró en el router
		$this->addToken(Slog::router()->controller, Slog::router()->action, Slog::router()->params);
	}
	
	public function addToken($controller, $action, $params)
	{
		$this->_tokens[] = array($controller, $action, $params);
	}
	
	public function exec()
	{
		do {
			list($controller, $action, $params) = array_shift($this->_tokens);
			// Obtenemos el objeto controller
			// - convertimos nombre-en-uri a NombreCamelCase
			$controller_class = ucfirst(preg_replace_callback('/([-\.]{1}[a-z]{1})/i', create_function(
				'$item',
				'return strtoupper(substr($item,1));'
			), $controller)) . 'Controller';
			$action_method = $this->mode . ucfirst(preg_replace_callback('/([-\.]{1}[a-z]{1})/i', create_function(
				'$item',
				'return strtoupper(substr($item,1));'
			), $action));
			
			// - cargamos el fichero con el controlador
			include_once(SLOG_DIR_APP . DIRECTORY_SEPARATOR . 'controllers' . DIRECTORY_SEPARATOR . $controller . '.php');
			
			// - existe el controlador?
			if (class_exists($controller_class)) {
				// - creamos objeto
				$controller_object = new $controller_class($params);

				// - existe el método?
				if (method_exists($controller_object, $action_method)) {
					// - indicamos el controlador/acción que se está ejecutando
					$this->_current_controller = $controller;
					$this->_current_action = $action;
					// - ejecutamos el método/acción
					$controller_object->$action_method($params);
					continue;
				}
			}
			
			// - la página solicitada no existe...
			if (class_exists('ErrorController')) {
				// - se lanza ErrorController::{mode}NotFound(app_uri);
				$this->addToken('error','not-found', array('uri'=>Slog::router()->getAppURI()));
			} else {
				// - se indica al navegador que no existe esta página
				ob_clean();
				header('HTTP/1.0 404 Not Found', true, 404);
				exit();
			}
		// Ejecutamos el bucle hasta que no haya más tokens en cola
		} while (count($this->_tokens) > 0);
	}
	
	public function getLastController()
	{
		return $this->_current_controller;
	}
	public function getLastAction()
	{
		return $this->_current_action;
	}
}
